package com.cskaoyan.javase._1interface._5extend;
/**
 * 方法的形参和方法的返回值类型
 *
 * 方法的形参在方法调用传入实参时，不一定要求数据类型完全一致。
 * 基本类型：对于基本数据类型的方法形参，存在自动类型提升。
 * 引用类型： 对于引用数据类型的方法传参，存在自动向上转型。
 * 形参如果写一个普通类：调用方法时需要传入的是该类的对象或者该类的子类对象
 * 形参如果写一个抽象类：调用方法时需要传入的是该抽象类的子类对象
 * 形参如果写一个接口：调用方法时需要传入的是该接口的子类对象
 *
 * 形参具有这种特点,方法的返回值类型和方法具体返回值的数据类型,也有这个特点
 * 方法的返回值类型，和在方法体中返回具体值（对象）时，不一定要求数据类型完全一致。
 *
 * 基本类型：方法体中，返回一个具体的值不要求和返回值类型完全一致，存在自动类型提升。
 * 引用类型： 在方法体中，返回一个对象时不要求就是返回值类型的对象，存在自动向上转型。
 *
 * 返回值类型如果写一个普通类：可以返回该类的对象或者该类的子类对象
 * 返回值类型如果写一个抽象类：返回该抽象类的子类对象。
 * 返回值类型如果写一个接口：返回该接口的子类对象。
 *
 *
 * @since 16:07
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test(new A());
        test(new ASon());

        // 抽象类作为形参数据类型,调用方法时需要传入抽象类的子类对象
        test(new AA());

        // 接口作为形参数据类型,调用方法时需要传入接口的子类/实现类对象
        test(new IAImpl());
    }

    public static void test(A a){}
    public static void test(BaseA a){}
    public static void test(IA a){}

    public static A test2(){
        // return new A();
        return new ASon();
    }

    public static BaseA test3(){
        // 抽象类作为返回值类型,具体需要返回抽象类的子类对象
        return new AA();
    }

    public static IA test4(){
        // 接口作为返回值类型,具体需要返回接口的子类/实现类对象
        return new IAImpl();
    }
}
class A{}
class ASon extends A{}
abstract class BaseA{}
class AA extends BaseA{}
interface IA{}
class IAImpl implements IA{}
